﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AdmLaboratorios.DTO;
using AdmLaboratorios.Business;

namespace AdmLaboratorios
{
    public partial class frmValeConsumo : Form
    {
        public eValeTipo Tipo { get; set; }

        public PartnerDTO Partner { get; set; }
        public OrdenProduccionDTO Op { get; set; }
        public List<OrdenProduccionItemDTO> OpItems { get; set; }
        public ValeConsumoDevolucionDTO Vale { get; set; }
        public DataTable items = new DataTable();

        public frmValeConsumo()
        {
            InitializeComponent();
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                Vale vale = new Vale();
                vale.Partner = Partner;
                vale.ValeConsumoDevolucion = FillHeader();
                vale.Items = FillItems();

                if (Validar(vale))
                {
                    vale = Business.Stock.SaveConsumo(vale);

                    FormsHelper.MsgGuardadoOk();

                    this.Close();
                }
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private bool Validar(Vale vale)
        {
            errP.Clear();

            if (vale.ValeConsumoDevolucion.IdOrdenProduccion == 0)
            {
                errP.SetError(btGuardar, "Se debe seleccionar una Orden de Produccion.");
                return false;
            }
            if (vale.Items.Count == 0)
            {
                errP.SetError(btGuardar, "Se deben ingresar Items al vale.");
                return false;
            }

            foreach (var item in vale.Items)
            {
                if (item.Cantidad == 0)
                {
                    errP.SetError(txNumeroOP, "Se debe ingresar 'Cantidad' para todos los Items.");
                    return false;
                }

                if (item.NroAnalisis.Trim() == string.Empty)
                {
                    errP.SetError(txNumeroOP, "Se debe ingresar 'NroAnalisis' para todos los Items.");
                    return false;
                }
            }

            foreach (DataRow dr in items.Rows)
            {
                if ((decimal)dr["Cantidad"] > (decimal)dr["STCantidad"])
                {
                    errP.SetError(txNumeroOP, "Para cada item, la cantidad del Vale, no puede ser mayor a la cantidad en Stock.");
                    return false;
                }
                
            }

            return true;
        }

        private void btOp_Click(object sender, EventArgs e)
        {
            ShowSeleccionarOP();
        }

        private void ShowSeleccionarOP()
        {
            using (frmOPSeleccion f = new frmOPSeleccion())
            {
                f.Partner = null;
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    CleanControls();

                    this.Op = f.OP;
                    this.OpItems = OrdenesProduccion.GetItems(f.OP.Id);
                    this.Partner = Partners.Get(this.Op.IdPartner);
                    LoadOP();

                    grpOp.Enabled = true;
                    grpItems.Enabled = true;
                    btGuardar.Enabled = true;
                    txObs.ReadOnly = false;
                    txObsImpresion.ReadOnly = false;
                }
            }
        }

        private void frmValeConsumo_Load(object sender, EventArgs e)
        {
            //FormsHelper.FillCombo(typeof(eValeTipo), cbTipoIngreso);
            cbTipoIngreso.Items.Add(eValeTipo.CONSUMO.ToString());
            cbTipoIngreso.Items.Add(eValeTipo.DEVOLUCION.ToString());
            cbTipoIngreso.SelectedIndex = 0;

            //txOperador.Text = BusinessHelper.Usuario.UsuarioDTO.Usuario;
            //txAprobador.Text = string.Empty;

            items = new DataTable();
            items.Columns.Add("IdProducto", typeof(int));
            items.Columns.Add("Producto");
            items.Columns.Add("NroAnalisis");
            items.Columns.Add("Cantidad", typeof(decimal));
            items.Columns.Add("IdStock", typeof(int));
            items.Columns.Add("Observaciones");

            items.Columns.Add("OPCantidad", typeof(decimal));
            items.Columns.Add("STCantidad", typeof(decimal));
            items.Columns.Add("STFactorCorreccion", typeof(decimal));

            items.AcceptChanges();

            FillGrid();

            //grpOp.Enabled = false;
            //grpItems.Enabled = false;
            btGuardar.Enabled = false;

            //lbEstado.Text = eInformeRecepcionEstado.EN_REVISION.ToString();
            //lbEstado.ForeColor = System.Drawing.Color.Blue;
        }

        private void CleanControls()
        {
            this.items.Rows.Clear();
        }

        private void LoadOP()
        {
            txNumeroOP.Text = Op.ToString();
            txProducto.Text = Productos.Get(Op.IdProducto).ToString();
            txPartner.Text = Partner.ToString();
            //var opItems = OrdenesProduccion.GetItems(Op.Id);
            var opItems = Stock.ValeConsumoItems(Op);

            foreach (DataRow dr in opItems.Rows)
            {
                items.Rows.Add(

                    dr["IdProducto"],
                    dr["Nombre"],       //Producto
                    dr["NroAnalisis"],  //NroAnalisis
                    (decimal)dr["OPCantidad"] * (decimal)dr["STFactorCorreccion"], //Cantidad (calculada o ingresada)
                    dr["Id"],           //IdStock
                    "",
                    (decimal)dr["OPCantidad"],
                    (decimal)dr["STCantidad"],
                    (decimal)dr["STFactorCorreccion"]
                    );
                
            }

            lbItemsCount.Text = items.Rows.Count.ToString();
        }

        private void FillGrid()
        {
            gvItems.DataSource = null;
            gvItems.DataSource = items;
            lbItemsCount.Text = items.Rows.Count.ToString();
        }

        private void btRemove_Click(object sender, EventArgs e)
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                if (MessageBox.Show("¿Está seguro de que desea quitar el item seleccionado?",
                    "Quitar Item", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    items.Rows.Remove(
                        ((DataRowView)gvItems.SelectedRows[0].DataBoundItem).Row);
                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }

        private void btEdit_Click(object sender, EventArgs e)
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                using (frmValeItem f = new frmValeItem())
                {
                    ValeConsumoDevolucionItemDTO irItem = new ValeConsumoDevolucionItemDTO();

                    irItem.Activo = true;
                    irItem.Cantidad = (decimal)gvItems.SelectedRows[0].Cells["Cantidad"].Value;
                    irItem.IdStock = (int)gvItems.SelectedRows[0].Cells["IdStock"].Value;
                    irItem.Obs = (string)gvItems.SelectedRows[0].Cells["Observaciones"].Value;

                    f.Item = irItem;
                    f.Producto = Productos.Get((int)gvItems.SelectedRows[0].Cells["IdProducto"].Value);
                    f.Stock = Business.Stock.Get(irItem.IdStock);
                    f.Partner = this.Partner;

                    FormsHelper.CargarColumnasGrilla(f);
                    if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        if (!EsStockRepetido(f.Stock))
                        {
                            gvItems.SelectedRows[0].Cells["IdProducto"].Value = f.Producto.Id;
                            gvItems.SelectedRows[0].Cells["Producto"].Value = f.Producto.Nombre;
                            gvItems.SelectedRows[0].Cells["NroAnalisis"].Value = f.Item.NroAnalisis;
                            gvItems.SelectedRows[0].Cells["Cantidad"].Value = f.Item.Cantidad;
                            gvItems.SelectedRows[0].Cells["IdStock"].Value = f.Item.IdStock;
                            gvItems.SelectedRows[0].Cells["Observaciones"].Value = f.Item.Obs;

                            gvItems.SelectedRows[0].Cells["OPCantidad"].Value = (decimal)GetOPCantidadByProducto(f.Stock.IdProducto);
                            gvItems.SelectedRows[0].Cells["STCantidad"].Value = f.Stock.Cantidad;
                            gvItems.SelectedRows[0].Cells["STFactorCorreccion"].Value = f.Stock.FactorCorreccion;

                        }
                    }
                }
            }
        }

        private decimal GetOPCantidadByProducto(int idProducto)
        {
            decimal cantidad = 0;
            foreach (OrdenProduccionItemDTO item in OpItems)
            {
                if (item.IdProducto == idProducto)
                    cantidad += item.Cantidad;
            }
            return cantidad;
        }

        private void btAdd_Click(object sender, EventArgs e)
        {
            using (frmValeItem f = new frmValeItem())
            {
                f.Partner = this.Partner;
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    if (!EsStockRepetido(f.Stock))
                    {
                        items.Rows.Add(
                            f.Producto.Id,
                            f.Producto.Nombre,
                            f.Item.NroAnalisis,
                            f.Item.Cantidad,
                            f.Item.IdStock,
                            f.Item.Obs,

                            Math.Round((decimal)GetOPCantidadByProducto(f.Stock.IdProducto), 4),   //OPCantidad
                            f.Stock.Cantidad,           //STCantidad
                            f.Stock.FactorCorreccion);  //STFactorCorreccion

                        lbItemsCount.Text = gvItems.RowCount.ToString();
                    }
                }
            }
        }

        private bool EsStockRepetido(StockDTO stock)
        {
            foreach (DataRow dr in items.Rows)
	        {
                if ((int)dr["IdStock"] == stock.Id)
                {
                    MessageBox.Show("No pueden existir dos Items en el Vale, que se correspondan al mismo registro del Stock.", 
                        "Stock Repetido", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return true;
                }
	        }
            return false;
        }

        private void cbTipoIngreso_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbTipoIngreso.SelectedIndex == 0)
            {
                this.Text = "Vale de Consumo";
                Tipo = eValeTipo.CONSUMO;
            }
            else
            {
                this.Text = "Vale de Devolución";
                Tipo = eValeTipo.DEVOLUCION;
            }
        }

        private ValeConsumoDevolucionDTO FillHeader()
        {
            ValeConsumoDevolucionDTO ir = new ValeConsumoDevolucionDTO();

            ir.Activo = true;
            ir.Tipo = this.Tipo.ToString().ToUpper();
            ir.Fecha = dt.Value;
            ir.IdOrdenProduccion = this.Op.Id;

            //
            if (txLetra.Text.Trim() != string.Empty)
                ir.Letra = txLetra.Text.Trim().Substring(0, 1);
            else
                ir.Letra = " ";

            ir.Numero = Convert.ToInt32(nuNumero.Value);
            ir.PtoVta = Convert.ToInt32(nuPtoVta.Value);
            ir.NroComprobante = string.Format("{0}{1}{2}", ir.Letra, ir.PtoVta, ir.Numero);
            //

            ir.Obs = txObs.Text;
            ir.ObsImpresion = txObsImpresion.Text;

            return ir;
        }

        private List<ValeConsumoDevolucionItemDTO> FillItems()
        {
            ValeConsumoDevolucionItemDTO item;
            List<ValeConsumoDevolucionItemDTO> itemsList = new List<ValeConsumoDevolucionItemDTO>();

            //int idx = 0;
            foreach (DataRow row in items.Rows)
            {
                item = new ValeConsumoDevolucionItemDTO();

                item.Activo = true;
                item.Cantidad = (decimal)row["Cantidad"];
                item.Obs = (string)row["Observaciones"];
                item.IdStock = (int)row["IdStock"];
                item.IdProducto = (int)row["IdProducto"];
                item.NroAnalisis = (string)row["NroAnalisis"];

                //idx++;
                itemsList.Add(item);
            }

            return itemsList;
        }

        internal void SetValues(int id)
        {
            try
            {
                this.Vale = Business.Stock.GetVale(id);
                this.items = Business.Stock.GetValeItemsTable(id);
                this.Op = Business.OrdenesProduccion.GetOp(Vale.IdOrdenProduccion);
                this.Partner = Business.Partners.Get(Op.IdPartner);

                if (Vale.Tipo.ToUpper().Trim() == eValeTipo.CONSUMO.ToString().ToUpper())
                    this.Tipo = eValeTipo.CONSUMO;
                else
                    this.Tipo = eValeTipo.DEVOLUCION;

                cbTipoIngreso.SelectedIndex = cbTipoIngreso.FindString(Vale.Tipo.ToUpper());
                txNumeroOP.Text = Op.ToString();
                txProducto.Text = Productos.Get(Op.IdProducto).ToString();
                
                dt.Value = Vale.Fecha;
                txLetra.Text = Vale.Letra;
                nuPtoVta.Value = Vale.PtoVta;
                nuNumero.Value = Vale.Numero;

                tblItems.Enabled = false;

                txObs.Text = Vale.Obs;
                txObsImpresion.Text = Vale.ObsImpresion;
                
                FillGrid();
                btGuardar.Enabled = false;
                
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void picProducto_Click(object sender, EventArgs e)
        {
            if (Op != null)
            {
                using (frmProductoDetalle f = new frmProductoDetalle())
                {
                    f.Producto = Productos.Get(Op.IdProducto);
                    FormsHelper.CargarColumnasGrilla(f);
                    f.ShowDialog();
                }
            }
        }

        private void picPartnerDetalle_Click(object sender, EventArgs e)
        {
            if (this.Partner != null)
            {
                using (frmPartnerDetalle f = new frmPartnerDetalle())
                {
                    f.Partner = this.Partner;
                    FormsHelper.CargarColumnasGrilla(f);
                    f.ShowDialog();
                }
            }
        }

        private void gvItems_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if ((decimal)gvItems.Rows[e.RowIndex].Cells["Cantidad"].Value > (decimal)gvItems.Rows[e.RowIndex].Cells["STCantidad"].Value)
            {
                e.CellStyle.BackColor = Color.LightCoral;
            }
        }
    }
}
